import re

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadData

from mall import settings
from users.models import User


def get_user_by_account(account):
    """
    通过账户名或者手机号查找用户
    部分功能代码 重复性代码 抽取封装
      定义一个方法
      将代码放到方法中
      缺少的变量以参数的形式传入

    解耦 降低耦合度
    """

    try:
        if re.match(r'1[4-9]\d{9}', account):
            # 通过手机号查找对应的用户对象
            user = User.objects.get(mobile=account)
        else:
            # 通过用户名查找对应的用户
            user = User.objects.get(username=account)
    except User.DoesNotExist:
        user = None

    return user


def send_token(user):
    from rest_framework_jwt.settings import api_settings
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)
    user.token = token  # 动态添加属性不影响表的字段
    return user, token


def generate_safe_user_token(token):
    # SECRET_KEY  密钥 一般使用settings中的
    # expires_in  过期时间 单位/秒
    serializer = Serializer(settings.SECRET_KEY, expires_in=3600)

    data = {"token": token}

    # # 对数据进行加密
    token = serializer.dumps(data)

    # 返回加密后的数据(其实就是openid)
    return token.decode()


from rest_framework_jwt.utils import jwt_decode_handler


def check_save_token_get_user(token):
    # SECRET_KEY  密钥 一般使用settings中的
    # expires_in  过期时间 单位/秒
    serializer = Serializer(settings.SECRET_KEY, expires_in=3600)
    try:
        # 对数据进行解密
        data = serializer.loads(token)

        dict = jwt_decode_handler(data["token"])

    except BadData:
        return None
    else:
        # 从解密后的请求发送过来的数据data中获取user_id
        user_id = dict["user_id"]

        # 返回解密后的openid
        return user_id


def generate_safe_user_token(token):
    # SECRET_KEY  密钥 一般使用settings中的
    # expires_in  过期时间 单位/秒
    serializer = Serializer(settings.SECRET_KEY, expires_in=3600)

    data = {"token": token}

    # # 对数据进行加密
    token = serializer.dumps(data)

    # 返回加密后的数据(其实就是openid)
    return token.decode()